package com.kimehwa.studyboot.partern.Interceptormode;

import com.kimehwa.studyboot.partern.Interceptormode.impl.ExceptionInterceptor;
import com.kimehwa.studyboot.partern.Interceptormode.impl.LogInterceptor;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xiaodongguan
 * @description   主要的类就是拦截器类，这个类存储了业务以及拦截器的列表。，并且
 *                 可以递归的调用interceptor 中得invoke方法，而invoke方法中
 *                 使用的索引可以在前面或者后面加上递归调用关系 ，然后今天要看一下
 *                 spring中得拦截器的使用方法
 * @since 2021-07-27 10:43
 */
public class Invocation {
    int index = 0;

    private BusinessService bs;

    private List<Interceptor> interceptors = new ArrayList<>();

    public Invocation() {

    }

    public void invoke() {
        if (index == interceptors.size()) {
            bs.perform();
        } else {
            Interceptor interceptor = interceptors.get(index);
            index++;
            interceptor.intercept(this);
        }
    }

    public void setInterceptors(Interceptor interceptor) {
        interceptors.add(interceptor);
    }

    public void setBusinessService(BusinessService bs) {
        this.bs = bs;
    }

    public static void main(String[] args) {
        Invocation invocation = new Invocation();
        invocation.setBusinessService(new BusinessService());
        invocation.setInterceptors(new LogInterceptor());
        invocation.setInterceptors(new ExceptionInterceptor());
        invocation.invoke();
    }
}
